package kontisim;

import algebra.Vector;

/**
 * Das explizite Euler-Verfahren ist ein Einschrittverfahren 1. Ordnung.
 *
 * @author Institut fuer Bauinformatik
 */
public class EulerTStep implements SimpleTStep {
    
    /**
     * Berechnet eine Approximation der Zustandsgroessen zum Zeitpunkt
     * <code>t+dt</code> nach dem expliziten Euler-Verfahren:
     * <code>x(t+dt) = x(t) + dt * dx(t)/dt</code>.
     * @param sys   Zu loesendes System
     * @param t     aktueller Zeitpunkt
     * @param dt    Schrittweite
     * @param x     Zustandsgroessen von <code>sys</code> zum Zeitpunkt t
     * @return      Zustandsgroessen von <code>sys</code> zum Zeitpunkt t+dt
     */
   
    
    @Override
    public Vector TimeStep(ODESystem sys, double t, double dt, Vector h, Vector ne, Vector S0) {
        Vector vec = sys.getValue(t, h);
        
        for (int i = 0; i < vec.size(); i++) {
            vec.set(i, h.get(i) + vec.get(i)*dt/(ne.get(i)+h.get(i)*S0.get(i)));
        }
        return vec;
    }

   
}
